package api;

import dropbox.Config;
import error.FileCorruptedException;
import error.NotLoggedInException;
import error.UserAlreadyExistsException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public interface API {

    /**
     * Adott nevű felhasználó létezésének vizsgálata.
     *
     * @param username a vizsgálandó felhasználónév
     * @return true, ha a megadott felhasználónévhez tartozó fájl megtalálható
     * az üzenetkönyvtárban
     * @throws IOException ha az üzenetkönyvtár olvasása sikertelen
     */
    public boolean userExists(String username) throws IOException;

    /**
     * Új felhasználó (és fájl) létrehozása a megadott néven.
     *
     * @param username az új felhasználó neve (angol abc kis- és nagybetűit és
     * számjegyeket tartalmazhat)
     * @throws IOException ha az üzenetkönyvtárhoz nem lehet hozzáférni vagy nem
     * írható
     * @throws UserAlreadyExistsException a megadott felhasználónévhez már
     * tartozik fájl
     */
    public void newUser(String username) throws IOException, UserAlreadyExistsException;

    /**
     * Be van-e jelentkezve felhasználó a kliensről.
     *
     * @return true, ha a kliens hívott login()-t és a belépés sikerült
     */
    public boolean isLoggedIn();

    /**
     * Adott nevű felhasználó beléptetése.
     *
     * @param username beléptetni kívánt felhasználó neve
     * @throws IOException az üzenetkönyvtár nem olvasható
     * @throws UserFileCorruptedException a felhasználói fájlból nem lehet
     * beolvasni az adatokat
     */
    public void login(String username) throws IOException, FileCorruptedException;

    /**
     * Bejelentkezett felhaasználó neve.
     *
     * @return a kliensen belépett felhasználó neve
     * @throws NotLoggedInException nincs bejelentkezett felhasználó
     */
    public String getUsername() throws NotLoggedInException;

    /**
     * Létrehozott témák listája
     *
     * @return összes téma címe
     */
    public Set<String> getTopics() throws NotLoggedInException;

    /**
     * Egy adott témába küldött üzenetek listája.
     *
     * @param topic téma neve
     * @return üzenetek listája
     * @throws NotLoggedInException ha nem lépett be felhasználó a kliensről
     */
    public List<Message> getMessages(String topic) throws NotLoggedInException;

    /**
     *
     * @return üzenetkönyvtár
     */
    public File getPath();

    /**
     * Új üzenet létrehozása.
     *
     * @param topic téma neve
     * @param text üzenet szövege
     * @throws IOException fájlba írás sikertelen
     * @throws FileCorruptedException felhasználói fájl hibás
     * @throws NotLoggedInException nem lépett be felhasználó a kliensről
     */
    public void newMessage(String topic, String text) throws IOException,
            FileCorruptedException, NotLoggedInException;

    public ArrayList<String> getAllUsers();

    /**
     *
     * @param username felhasználó neve
     * @return felhasználó fájljának mérete
     * @throws IOException fájl olvasása sikertelen
     */
    public long getUserFileSize(String username) throws IOException;

    /**
     * Frissíti az üzenetek listáját: beolvassa a felhasználói fájlokat és
     * hozzáfésüli az üzeneteiket az összesített listához.
     *
     * @throws IOException fájl olvasása sikertelen
     * @throws FileCorruptedException nem tudja a User osztályt beolvasni a
     * felhasználói fájlból
     * @throws NotLoggedInException nem lépett be felhasználó a kliensről
     */
    public void loadAllUserMessages() throws IOException, FileCorruptedException, NotLoggedInException;

    /**
     * Konfigurációs fájl által tartalmazott paraméterek elérése.
     *
     * @return Konfigurációs osztály referenciája
     */
    public Config getConfig();
}
